﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace 随机红包算法
{
    class Program
    {
        static void Main(string[] args)
        {
            //在linqpad里面执行
            //Util.Chart(
            //    Measure(10, 50_0000).Select((v, i) => new { X = i, Y = v }),
            //    x => x.X, y => y.Y, Util.SeriesType.Bar
            //    ).Dump();
        }

        /// <summary>
        /// 
        /// </summary>
        /// 1.random.Next(): 返回非负的一个随机数
        /// 2.random.Next(MaxValue): 返回一个小于所指定最大值的非负随机数(注意:a.是小于最大值要生成的随机数的上界（随机数不能取该上界值）; 
        /// b.maxValue 类型：[System..::.Int32],maxValue 必须大于等于零。
        /// 3.Random..::.Next(minValue , maxValue) : 返回一个指定范围内的随机数.
        /// 4.返回值 类型: [System..::.Int32],一个大于等于 minValue 且小于 maxValue 的 32 位带符号整数，
        /// 即：返回的值范围包括 minValue 但不包括maxValue。如果 minValue 等于 maxValue，则返回 minValue。
        public static T[] ShuffleCopy<T>(IEnumerable<T> data, Random r)
        {
            var arr = data.ToArray();
            for (int i = arr.Length-1;i>0;--i)
            {
                int randomIndex = r.Next(i + 1);

                T temp = arr[i];
                arr[i] = arr[randomIndex];
                arr[randomIndex] = temp;
            }
            return arr;
        }

        public static int[] Measure(int n, int maxTime)
        {
            var data = Enumerable.Range(1, n);
            var sum=new int[n];

            var r = new Random();
            for (int times = 0; times < maxTime; ++times)
            {
                var result = ShuffleCopy(data, r);
                for (int i = 0; i < n; ++i)
                {
                    sum[i] += result[i] != i ? 1 : 0;
                }
            }
            return sum;
        }

    }
}
